home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Power 1996 October
/
MACPOWER-1996-10.ISO.7z
/
MACPOWER-1996-10.ISO
/
AMUG
/
Internet_31
/
NetCacheResolver 0.9d6
/
NetCacheResolver 0.9d6 ト
/
library
/
NCR_AppleEvent.c
next >
Wrap
Text File
|
1996-05-12
|
33KB
|
1,135 lines
// NetCache Resolver, 1995 (C) Mizutori Tetsuya
// - NCR_AppleEvent.c, October 10, 1995
// This document is pretty printed in 10-point Geneva font.
#include <AppleEvents.h>
#include <AERegistry.h>
#include <AEObjects.h>
#include "NCR_Basic.h"
#include "NCR_AppleEvent.h"
#include "NCR_File.h"
#include "NCR_Resolve.h"
#include "NCR_Qsort.h"
#include "NCR_Error.h"
#ifdef DEBUG
#include "NCR_Message.h"
#endif /* DEBUG */
#ifdef COMMNET
1. Initialize
call SetupAppleEvent()
2. Apple Event precess
case: AEOpenApplication
call DoOpenApplication()
// set gAEOpenAppl = true
case: AEOpenDocuments
/// call DoOpenDocumentBegin()
call DoOpenDocument( &theFSSpec, index, count ) for each file
// set gAEOpenDoc = true
/// call DoOpenDocumentEnd()
case: AEPrintDocuments
call DoPrintDocument()
// set gAEPrintDoc = true
case: AEQuitApplication
call DoQuitApplication()
// set gAEQuitAppl = true
#endif /* COMMENT */
enum myAppleEventSuits {
kAEActivate = 'actv',
// AppleScript Command: resolve $typeAlias$ [with sorted by $Enum$]
kNCRSuite = 'MzcR', // EVENT CLASS
kAEResolve = 'rslv', // EVENT ID
// Reply:
// typeAEList = 'list', // a list of string 'TEXT'
// Direct Parameter:
// typeAlias = 'alis', // a list of aliases
// Other Parameters: [with sorted by name/date/size/type/url]
kAESorted = 'soby', // KEYWORD
typeSortOption = 'Esrt', // see also Enumaration
// AppleScript Command: sort $typeAEList$
// [at $integer$] [in regular/normal] [as alphabet/number] [with $TEXT$]
// kNCRSuite = 'MzcR', // EVENT CLASS
kAESort = 'sort', // EVENT ID
// Reply:
// typeAEList = 'list', // a list of string 'TEXT'
// Direct Parameter:
// typeAEList = 'list', // a list of string 'TEXT'
// Other Parameter: [at $integer$]
kAEPosition = 'posn', // KEYWORD
// typeLongInteger = 'long', // field number
// Other Parameter: [by name/date/size/type/url]
// kAESorted = 'soby', // KEYWORD
// typeSortOption = 'Esrt', // see also Enumaration
// Other Parameter: [in regular/normal]
kAEOrder = 'ordr', // KEYWORD
typeOrderOption = 'Eord', // see also Enumaration
// Other Parameter: [as alphabet/number]
kAETypeAs = 'type', // KEYWORD
typeTypeOption = 'Etyp', // see also Enumaration
// Other Parameter: [with $TEXT$]
kAESeparator = 'sepa', // KEYWORD
// typeChar = 'TEXT', // field separator
// AppleScript Command: assign $typeObjectSpecifier$ to value
// kNCRSuite = 'MzcR', // EVENT CLASS
// kAESetData = 'setd', // EVENT ID
// Reply:
// typeNull = 'null',
// Direct Parameter:
// typeObjectSpecifier = 'obj ', // an object
// Other Parameters: to value
// kAEData = 'data', // KEYWORD
// typeWildCard = '****',
// AppleScript Command: show about
// kNCRSuite = 'MzcR', // EVENT CLASS
kAEShowAbout = 'abou', // EVENT ID
// Reply:
// typeNull = 'null',
// Direct Parameter:
// typeNull = 'null',
// Other Parameters:
// typeNull = 'null',
_myAppleEventSuits
};
enum myEnumerateKey {
// typeSortOption = 'Esrt',
keyByName = 'sona',
keyByDate = 'soda',
keyBySize = 'sosi',
keyByType = 'soty',
keyByUrl = 'sour',
_myEnumerationKey
};
enum myEnumrateOrder {
// typeOrderOption = 'Eord',
keyOrdRegular = 'norm',
keyOrdReverse = 'revs',
_myEnumrationOrder
};
enum myEnumerateTypeAs {
// typeTypeOption = 'Etyp',
keyTypeAlpha = 'alph',
keyTypeNumb = 'numb',
_myEnumerateTypeAs
};
enum cacheLogField {
kSortByName = 4,
kSortByDate = 3,
kSortBySize = 8,
kSortByType = 6,
kSortByUrl = 5,
_cacheLogField
};
enum viewByConstants {
// typeviewBy = 'vwBY',
viewBySmallIcon = 'smic', // 0; bySmallIcon
viewByIcon = 'iimg', // 1; byIcon
viewByName = 'pnam', // 2; byName
viewByModDate = 'modd', // 3; byModDate
viewBySize = 'ptsz', // 4; bySize
viewByKind = 'kind', // 5; byKind
viewByCommnet = 'comt', // 6; byComment
viewByLabel = 'labi', // 7; byLabel
viewByVersion = 'vers', // 8; byVersion
_viewByConstants
};
#ifdef COMMENT
enum AppleEventConstants {
kCoreEventClass = 'aevt',
kAECoreSuite = 'core',
kAEMiscStandards = 'misc',
kAEOpenApplication = 'oapp',
kAEOpenDocuments = 'odoc',
kAEPrintDocuments = 'pdoc',
kAEQuitApplication = 'quit',
kAESetData = 'setd',
kAEData = 'data',
kAENoReply = 0x00000001,
typeChar = 'TEXT',
typeAEList = 'list',
typeAERecord = 'reco',
typeFSS = 'fss ',
typeObjectSpecifier = 'obj ',
typeWildCard = '****',
typeType = 'type',
typeKeyword = 'keyw',
typeNull = 'null',
keyDirectObject = '----',
keyErrorNumber = 'errn',
keyErrorString = 'errs',
_AppleEventConstants
};
#endif /* COMMENT */
/***** Constants & Globals *****/
//extern Boolean gAEOpenAppl;
//extern Boolean gAEOpenDocs;
//extern Boolean gAEPrintDoc;
//extern Boolean gAEQuitAppl;
// callback functions, defined in 'main.c'
extern OSErr DoOpenApplication ( void );
extern OSErr DoQuitApplication ( void );
extern OSErr DoPrintDocument ( void );
//extern OSErr DoOpenDocumentBegin ( void );
//extern OSErr DoOpenDocumentEnd ( void );
extern OSErr DoOpenDocument ( FSSpec *theFSSpec, long index, long count );
// prototypes
/***** Do Apple Event process *****/
pascal OSErr DoOpenApp ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
pascal OSErr DoOpenDoc ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
pascal OSErr DoPrintDoc ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
pascal OSErr DoQuitApp ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
/***** AppleScript Suite *****/
pascal OSErr DoActivate ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
pascal OSErr DoResolve ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
pascal OSErr DoSort ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
pascal OSErr DoSetData ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
pascal OSErr DoShowAbout ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
pascal OSErr DoMiscEvent ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
/***** Apple Event routines *****/
static OSErr GotRequiredParams ( AppleEvent *appleEvent );
static OSErr AEPutFieldArray ( AEDescList *resultList, ArrayHandle arrayH );
static void ErrMsgAE ( long err, Boolean fatal );
/***** setup Apple Event handles *****/
#define AEInstall(eventClass,eventID,procHandle) {¥
err = AEInstallEventHandler( eventClass, eventID, (AEEventHandlerProcPtr)procHandle, 0L, false); ¥
if ( err != noErr ) ErrorMessageAE( err, true ); }
void SetupAppleEvent ( void )
{
OSErr err;
long feature;
GestaltCheck( gestaltAppleEventsAttr );
// for Required Suite
AEInstall( kCoreEventClass, kAEOpenApplication, DoOpenApp );
AEInstall( kCoreEventClass, kAEOpenDocuments, DoOpenDoc );
AEInstall( kCoreEventClass, kAEPrintDocuments, DoPrintDoc );
AEInstall( kCoreEventClass, kAEQuitApplication, DoQuitApp );
// for AppleScript Suite
// AEInstall( kAECoreSuite, kAECreateElement, DoCreateElement );
// AEInstall( kAECoreSuite, kAEClose, DoCloseElement );
AEInstall( kAEMiscStandards, kAEActivate, DoActivate );
AEInstall( kNCRSuite, kAESetData, DoSetData );
// AEInstall( kAECoreSuite, kAEGetData, DoGetData );
AEInstall( kNCRSuite, kAEResolve, DoResolve );
AEInstall( kNCRSuite, kAESort, DoSort );
AEInstall( kNCRSuite, kAEShowAbout, DoShowAbout );
// AEInstall( typeWildCard, typeWildCard, DoMiscEvent );
#ifdef COMMENT // for Resolving Object Specifier Records
err = AEInstallObjectAccessor( cProperty, typeWildCard, (OSLAccessorProcPtr) MyPropertyObjectAccessor, 0, false );
if ( err != noErr ) Message("MyPropertyObjectAccessor not available.¥n");
err = AEInstallObjectAccessor( typeWildCard, typeWildCard, (OSLAccessorProcPtr) MyObjectAccessor, 0, false );
if ( err != noErr ) Message("MyObjectAccessor not available.¥n");
err = AESetObjectCallbacks(
(OSLCompareProcPtr) MyCompareObjects,
(OSLCountProcPtr) MyCountObjects,
(OSLDisposeTokenProcPtr)nil,
(OSLGetMarkTokenProcPtr)nil,
(OSLMarkProcPtr)nil,
(OSLAdjustMarksProcPtr)nil,
(OSLGetErrDescProcPtr)nil);
if ( err != noErr ) Message("AESetObjectCallbacks not available.¥n");
#endif /* COMMENT */
err = AESetInteractionAllowed( kAEInteractWithLocal );
}
/***** Do Apple Event process *****/
pascal OSErr DoOpenApp ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
{
#ifdef DEBUG
Message("Apple event: Open Application Event¥n");
#endif /* DEBUG */
DoOpenApplication();
// gAEOpenAppl = true;
return noErr;
}
pascal OSErr DoOpenDoc ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
{
AEDescList fileSpecList = {typeNull, nil};
FSSpec fileSpec;
DescType type;
AEKeyword keyword;
Size actual;
long count;
long index;
OSErr err = noErr;
#ifdef DEBUG
Message("Apple event: Open Document Event¥n");
#endif /* DEBUG */
// DoOpenDocumentBegin();
err = AEGetParamDesc( theAppleEvent, keyDirectObject, typeAEList, &fileSpecList);
if ( err != noErr ) { ErrMsgAE( err, false); goto out; }
err = GotRequiredParams( theAppleEvent );
if ( err != noErr ) { ErrMsgAE( err, false ); goto out; }
err = AECountItems( &fileSpecList, &count );
if ( err != noErr ) { ErrMsgAE( err, false ); goto out; }
for (index=1; index<=count; index++) {
err = AEGetNthPtr( &fileSpecList, index, typeFSS, &keyword, &type,
(Ptr) &fileSpec, sizeof( FSSpec ), &actual );
if ( err != noErr ) { ErrMsgAE( err, false ); goto out; }
err = DoOpenDocument( &fileSpec, index, count );
if ( err != noErr ) break;
}
out:
if ( fileSpecList.dataHandle != nil ) AEDisposeDesc( &fileSpecList );
// DoOpenDocumentEnd();
// gAEOpenDocs = true;
return err;
}
pascal OSErr DoPrintDoc ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
{
#ifdef DEBUG
Message("Apple event: Print Document Event¥n");
#endif /* DEBUG */
DoPrintDocument();
// gAEPrintDoc = true;
return noErr;
}
pascal OSErr DoQuitApp ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
{
#ifdef DEBUG
Message("Apple event: Quit Application Event¥n");
#endif /* DEBUG */
DoQuitApplication();
// gAEQuitAppl = true;
return noErr;
}
/***** AppleScript Suite *****/
/***** Command: activate *****/
pascal OSErr DoActivate ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
{
ProcessSerialNumber PSN;
OSErr err;
#ifdef DEBUG
Message("Apple event: Activate Event¥n");
#endif /* DEBUG */
err = GetCurrentProcess( &PSN );
if ( err != noErr ) {
ErrMsgAE( err, false );
} else {
err = SetFrontProcess( &PSN );
}
return err;
}
/***** Command: resolve *****/
#ifdef COMMENT
// AppleScript Command: resolve $typeAlias$ [with sorted by $Enum$]
kNCRSuite = 'MzcR', // EVENT CLASS
kAEResolve = 'rslv', // EVENT ID
// Reply:
typeAEList = 'list', // a list of string 'TEXT'
// Direct Parameter:
typeAlias = 'alis', // a list of aliases
// Other Parameters: [with sorted by name/date/size/type/url]
kAESorted = 'soby', // KEYWORD
typeSortOption = 'Esrt', // see also Enumaration
#endif /* COMMENT */
pascal OSErr DoResolve ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
{
AEDescList fileSpecList = {typeNull, nil};
AEDesc fileSpecDesc = {typeNull, nil};
AEDesc desc = {typeNull, nil};
long sortKeyPosition = 0;
Boolean withSorted = false;
Boolean asNumber = false;
Boolean inReverse = false;
AEDescList resultList = {typeNull, nil};
long index, indexLast=0, count;
DescType type, dataType;
OSErr err = noErr;
#ifdef DEBUG
Message("Apple event: Resolve Event¥n");
#endif /* DEBUG */
// Responding to AppleEvent message
// Get Direct Parameter
#ifdef DEBUG
Message("DoResolve: Direct Param¥n");
#endif /* DEBUG */
err = AEGetParamDesc( theAppleEvent, keyDirectObject, typeAEList, &fileSpecList); // created 'fileSpecList'
if ( err != noErr ) { ErrMsgAE( err, false); goto out_responding; }
err = AECountItems( &fileSpecList, &count );
if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
for (index=1; index<=count; index++) {
FSSpec fileSpec;
Size actual;
AEKeyword keyword;
err = AEGetNthPtr( &fileSpecList, index, typeFSS, &keyword, &type,
(Ptr) &fileSpec, sizeof( FSSpec ), &actual );
if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
AEPutFile ( &fileSpec );
}
// Get Other Parameter [with sorted by $Enum$]
#ifdef DEBUG
Message("DoResolve: Other Param [with sorted by]¥n");
#endif /* DEBUG */
err = AEGetParamDesc( theAppleEvent, kAESorted, typeWildCard, &desc); // created 'desc'
if ( err != noErr ) {
if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
// sortKeyPosition = 0;
// withSorted = false;
} else {
type = desc.descriptorType;
if ( type == typeEnumerated ) {
dataType = * (DescType *) *desc.dataHandle;
#ifdef DEBUG
Message("DoResolve: Param [with sorted by '%T'] as '%T'¥n", dataType, type );
#endif /* DEBUG */
withSorted = true; asNumber = false; inReverse = false;
switch ( dataType ) {
case keyByName: sortKeyPosition = kSortByName; break;;
case keyByDate: sortKeyPosition = kSortByDate; asNumber = true; inReverse = true; break;
case keyBySize: sortKeyPosition = kSortBySize; asNumber = true; inReverse = true; break;
case keyByType: sortKeyPosition = kSortByType; break;
case keyByUrl: sortKeyPosition = kSortByUrl; break;
default:
#ifdef DEBUG
Message("DoResolve: Wrong Param [with sorted by '%T'] as '%T'¥n", dataType, type );
#endif /* DEBUG */
withSorted = false;
err = errAEWrongDataType; goto out_responding;
break;
}
} else {
#ifdef DEBUG
Message("DoResolve: Wrong Param [with sorted by '%T']¥n", type );
#endif /* DEBUG */
withSorted = false;
err = errAEWrongDataType; goto out_responding;
}
}
if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose of 'desc'
// Have I read through the parameters?
#ifdef DEBUG
Message("Apple event: DoResolve GotRequiredParams()¥n");
#endif /* DEBUG */
err = GotRequiredParams( theAppleEvent );
if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
out_responding:
if ( fileSpecList.dataHandle != nil ) AEDisposeDesc( &fileSpecList ); // dispose of 'fileSpecList'
if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose of 'desc' if needed
if ( err != noErr ) goto out;
// Handling data with parameters
count = AECountFileList();
// Creating and Sending AppleEvent message
#ifdef DEBUG
Message("Apple event: DoResolve AECreateList()¥n");
#endif /* DEBUG */
err = AECreateList( nil, 0, false, &resultList ); // create a AEDisc 'resultList'
if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
// add the contents of the file to 'resultList'
for ( index=0; index<count; index++ ) {
FSSpec fileSpec;
FInfo fileInfo;
Handle arrayH = nil;
Handle theHndl = nil;
long datasize, arraySize;
AEGetFile ( &fileSpec, index );
#ifdef DEBUG
Message("filename[%ld]='%S'¥n",(index+1),fileSpec.name);
Message("Apple event: DoResolve AEPutPtr(%ld)¥n", (index+1));
#endif /* DEBUG */
#ifdef Not_Yet_Implemented
err = AEPutPtr( &resultList, indexLast, typeChar, &fileSpec.name[1], fileSpec.name[0] );
if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
#else /* Not_Yet_Implemented */
// read record from the file
theHndl = NewHandleClear( 0 ); // create a Handle 'theHndl'
if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
err = GetRecordFromFile ( &fileSpec, &fileInfo, theHndl, &datasize );
if ( err != noErr ) { ErrMsgAE( err, false ); goto out_putting; }
// convert 'theHndl' to 'arrayH' with sorting
arrayH = NewHandleClear( 0 ); // create a Handle 'arrayH'
if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
// use default Field Separator and Record Separator
arraySize = SetupFieldArray( theHndl, (ArrayHandle) arrayH, sortKeyPosition );
if ( withSorted ) {
HLock( arrayH );
qsort( (Array *) *arrayH, 0, arraySize-1, asNumber, inReverse );
HUnlock( arrayH );
}
// add 'arrayH' to 'resultList'
err = AEPutFieldArray( &resultList, (ArrayHandle) arrayH );
if ( err != noErr ) { ErrMsgAE( err, false ); }
out_putting:
if ( arrayH != nil ) DisposeHandle( arrayH ); // dispose the Handle 'arrayH'
if ( theHndl != nil ) DisposeHandle( theHndl ); // dispose the Handle 'theHndl'
#endif /* Not_Yet_Implemented */
}
#ifdef DEBUG
Message("Apple event: DoResolve AEPutParamDesc()¥n");
#endif /* DEBUG */
err = AEPutParamDesc( reply, keyDirectObject, &resultList );
if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
out_sending:
if ( resultList.dataHandle != nil ) AEDisposeDesc( &resultList ); // dispose the AEDisc 'resultList'
out:
AEDisposFileList();
return err;
}
/***** Command: sort *****/
#ifdef COMMENT
// AppleScript Command: sort $typeAEList$
// [at $integer$] [in regular/normal] [as alphabet/number] [with $TEXT$]
kNCRSuite = 'MzcR', // EVENT CLASS
kAESort = 'sort', // EVENT ID
// Reply:
typeAEList = 'list', // a list of string 'TEXT'
// Direct Parameter:
typeAEList = 'list', // a list of string 'TEXT'
// Other Parameters: [at $integer$]
kAEPosition = 'posn', // KEYWORD
typeLongInteger = 'long', // field number
// Other Parameter: [by name/date/size/type/url]
kAESorted = 'soby', // KEYWORD
typeSortOption = 'Esrt', // see also Enumaration
// Other Parameters: [in regular/normal]
kAEOrder = 'ordr', // KEYWORD
typeOrderOption = 'Eord', // see also Enumaration
// Other Parameters: [as alphabet/number]
kAETypeAs = 'type', // KEYWORD
typeTypeOption = 'Etyp', // see also Enumaration
// Other Parameters: [with $TEXT$]
kAESeparator = 'sepa', // KEYWORD
typeChar = 'TEXT', // field separator
#endif /* COMMENT */
#define TAB '¥t' // Field Separator
#define EOL '¥r' // Record Separator
pascal OSErr DoSort ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
{
AEDescList descList = {typeNull, nil};
AEDescList resultList = {typeNull, nil};
AEDesc desc = {typeNull, nil};
DescType type, dataType;
AEKeyword theAEKeyword;
Handle theHndl = nil;
Handle arrayH = nil;
long size;
long sortKeyPosition = 4;
Boolean inReverse = false;
Boolean asNumber = false;
unsigned char fieldSeparator = TAB;
long count, index;
OSErr err = noErr;
#ifdef DEBUG
Message("Apple event: Sort Event¥n");
#endif /* DEBUG */
// Responding to AppleEvent message
// Direct Parameter
#ifdef DEBUG
Message("DoSort: Direct Param¥n");
#endif /* DEBUG */
err = AEGetParamDesc( theAppleEvent, keyDirectObject, typeAEList, &descList ); // create AEDisc 'descList'
if ( err != noErr ) { ErrMsgAE( err, false); goto out_responding; }
err = AECountItems( &descList, &count );
if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
theHndl = NewHandleClear( 0 ); // create a handle 'theHndl'
if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
for (index=1; index<=count; index++) {
Handle theHndl2;
long size2;
err = AEGetNthDesc( &descList, index, typeChar, &theAEKeyword, &desc ); // created 'desc'
if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
theHndl2 = desc.dataHandle;
size = GetHandleSize(theHndl);
size2 = GetHandleSize(theHndl2);
SetHandleSize( theHndl, size+size2+1);
if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
BlockMove( (Ptr) *theHndl2, (Ptr) *theHndl+size, size2 );
((unsigned char *) *theHndl)[size+size2] = EOL;
if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose of 'desc'
}
// Other Parameter [at $integer$]
#ifdef DEBUG
Message("DoSort: Param [at $integer$]¥n");
#endif /* DEBUG */
desc.dataHandle = nil;
err = AEGetParamDesc( theAppleEvent, kAEPosition, typeWildCard, &desc); // created 'desc'
if ( err != noErr ) {
if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
// sortKeyPosition = 0;
} else {
type = desc.descriptorType;
if ( type == typeLongInteger ) {
sortKeyPosition = * (long *) *desc.dataHandle;
#ifdef DEBUG
Message("DoSort: Param [at %ld] as '%T'¥n", sortKeyPosition, type );
#endif /* DEBUG */
} else {
#ifdef DEBUG
Message("DoSort: Wrong Param by '%T'¥n", type );
#endif /* DEBUG */
err = errAEWrongDataType; goto out_responding;
}
}
if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose of 'desc'
// Get Other Parameter [by name/date/size/type/url]
#ifdef DEBUG
Message("DoResolve: Other Param [with sorted by]¥n");
#endif /* DEBUG */
err = AEGetParamDesc( theAppleEvent, kAESorted, typeWildCard, &desc); // created 'desc'
if ( err != noErr ) {
if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
// sortKeyPosition = 0;
} else {
type = desc.descriptorType;
if ( type == typeEnumerated ) {
dataType = * (DescType *) *desc.dataHandle;
#ifdef DEBUG
Message("DoResolve: Param [with sorted by '%T'] as '%T'¥n", dataType, type );
#endif /* DEBUG */
asNumber = false; inReverse = false;
switch ( dataType ) {
case keyByName: sortKeyPosition = kSortByName; break;;
case keyByDate: sortKeyPosition = kSortByDate; asNumber = true; inReverse = true; break;
case keyBySize: sortKeyPosition = kSortBySize; asNumber = true; inReverse = true; break;
case keyByType: sortKeyPosition = kSortByType; break;
case keyByUrl: sortKeyPosition = kSortByUrl; break;
default:
#ifdef DEBUG
Message("DoResolve: Wrong Param [with sorted by '%T'] as '%T'¥n", dataType, type );
#endif /* DEBUG */
err = errAEWrongDataType; goto out_responding;
break;
}
} else {
#ifdef DEBUG
Message("DoResolve: Wrong Param [with sorted by '%T']¥n", type );
#endif /* DEBUG */
err = errAEWrongDataType; goto out_responding;
}
}
if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose of 'desc'
// Other Parameter [in regular/normal]
#ifdef DEBUG
Message("DoSort: Param [in regular/normal]¥n");
#endif /* DEBUG */
desc.dataHandle = nil;
err = AEGetParamDesc( theAppleEvent, kAEOrder, typeWildCard, &desc); // created 'desc'
if ( err != noErr ) {
if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
// inReverse = false;
} else {
type = desc.descriptorType;
if ( type == typeEnumerated ) {
dataType = * (DescType *) *desc.dataHandle;
#ifdef DEBUG
Message("DoSort: Param [in '%T'] as '%T'¥n", dataType, type );
#endif /* DEBUG */
switch ( dataType ) {
case keyOrdRegular: inReverse = false; break;
case keyOrdReverse: inReverse = true; break;
default:
#ifdef DEBUG
Message("DoSort: Wrong Param [in '%T'] by '%T'¥n", dataType, type );
#endif /* DEBUG */
err = errAEWrongDataType; goto out_responding;
break;
}
} else {
#ifdef DEBUG
Message("DoSort: Wrong Param by '%T'¥n", type );
#endif /* DEBUG */
err = errAEWrongDataType; goto out_responding;
}
}
if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose of 'desc'
// Other Parameter [as alphabet/number]
#ifdef DEBUG
Message("DoSort: Param [as alphabet/number]¥n");
#endif /* DEBUG */
desc.dataHandle = nil;
err = AEGetParamDesc( theAppleEvent, kAETypeAs, typeWildCard, &desc); // created 'desc'
if ( err != noErr ) {
if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
// asNumber = false;
} else {
type = desc.descriptorType;
if ( type == typeEnumerated ) {
dataType = * (DescType *) *desc.dataHandle;
#ifdef DEBUG
Message("DoSort: Param [as '%T'] as '%T'¥n", dataType, type );
#endif /* DEBUG */
switch ( dataType ) {
case keyTypeAlpha: asNumber = false; break;
case keyTypeNumb: asNumber = true; break;
default:
#ifdef DEBUG
Message("DoSort: Wrong Param [as '%T'] by '%T'¥n", dataType, type );
#endif /* DEBUG */
err = errAEWrongDataType; goto out_responding;
break;
}
} else {
#ifdef DEBUG
Message("DoSort: Wrong Param by '%T'¥n", type );
#endif /* DEBUG */
err = errAEWrongDataType; goto out_responding;
}
}
if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose of 'desc'
// Other Parameter [with $TEXT$]
#ifdef DEBUG
Message("DoSort: Param [with $TEXT$]¥n");
#endif /* DEBUG */
desc.dataHandle = nil;
err = AEGetParamDesc( theAppleEvent, kAESeparator, typeWildCard, &desc); // created 'desc'
if ( err != noErr ) {
if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
// fieldSeparator = TAB;
} else {
type = desc.descriptorType;
if ( type == typeChar ) {
fieldSeparator = * (unsigned char *) *desc.dataHandle;
#ifdef DEBUG
Message("DoSort: Param [with ¥¥%03o] as '%T'¥n", fieldSeparator, type );
#endif /* DEBUG */
} else {
#ifdef DEBUG
Message("DoSort: Wrong Param by '%T'¥n", type );
#endif /* DEBUG */
err = errAEWrongDataType; goto out_responding;
}
}
if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose of 'desc'
// Have I read through the parameters?
#ifdef DEBUG
Message("Apple event: DoSort GotRequiredParams()¥n");
#endif /* DEBUG */
err = GotRequiredParams( theAppleEvent );
if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
out_responding:
if ( desc.dataHandle != nil ) AEDisposeDesc( &desc ); // dispose the AEDesc 'desc' if needed
if ( err != noErr ) goto out;
// Handling data with parameters
arrayH = NewHandleClear( 0 ); // create a Handle 'arrayH'
if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
((Array *) *arrayH)->fs = fieldSeparator;
count = SetupFieldArray( theHndl, (ArrayHandle) arrayH, sortKeyPosition );
HLock( arrayH );
qsort( (Array *) *arrayH, 0, count-1, asNumber, inReverse );
HUnlock( arrayH );
// Creating and Sending AppleEvent message
#ifdef DEBUG
Message("Apple event: DoResolve AECreateList()¥n");
#endif /* DEBUG */
err = AECreateList( nil, 0, false, &resultList ); // create a AEDesc 'resultList'
if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
err = AEPutFieldArray( &resultList, (ArrayHandle) arrayH );
if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
#ifdef DEBUG
Message("Apple event: DoSort AEPutParamDesc()¥n");
#endif /* DEBUG */
err = AEPutParamDesc( reply, keyDirectObject, &resultList );
if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
out_sending:
if ( arrayH != nil ) DisposeHandle( arrayH ); // dispose the Handle 'arrayH'
if ( resultList.dataHandle != nil ) AEDisposeDesc( &resultList ); // dispose the AEDesc 'resultList'
goto out;
out:
if ( theHndl != nil ) DisposeHandle( theHndl); // dispose handle 'theHndl'
return err;
}
/***** Command: assign *****/
#ifdef COMMENT
// AppleScript Command: assign $typeObjectSpecifier$ to value
kNCRSuite = 'MzcR', // EVENT CLASS
kAESetData = 'setd', // EVENT ID
// Reply:
typeNull = 'null',
// Direct Parameter:
typeObjectSpecifier = 'obj ', // an object
// Other Parameters: to value
kAEData = 'data', // KEYWORD
typeWildCard = '****',
#endif /* COMMENT */
pascal OSErr DoSetData ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
{
#ifdef DEBUG
Message("Apple event: Set Data Event¥n");
#endif /* DEBUG */
// Sorry, do nothing here.
return noErr;
}
/***** Command: show about *****/
#ifdef COMMENT
// AppleScript Command: show about
kNCRSuite = 'MzcR', // EVENT CLASS
kAEShowAbout = 'abou', // EVENT ID
// Reply:
typeNull = 'null',
// Direct Parameter:
typeNull = 'null',
// Other Parameters:
typeNull = 'null',
#endif /* COMMENT */
#define kAboutID 130
pascal Boolean idleProc ( EventRecord *event, long *sleeptime, RgnHandle *mouseRgn );
pascal OSErr DoShowAbout ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
{
OSErr err;
#ifdef DEBUG
Message("Apple event: Show About¥n");
#endif /* DEBUG */
err = AEInteractWithUser( kAEDefaultTimeout, nil, (AEIdleProcPtr) idleProc );
if ( err != noErr ) { ErrMsgAE( err, false ); return err; }
Alert( kAboutID, nil );
return noErr;
}
pascal Boolean idleProc ( EventRecord *event, long *sleeptime, RgnHandle *mouseRgn )
{
switch ( event->what ) {
case updateEvt:
case activateEvt:
case osEvt:
break;
case nullEvent:
SystemTask();
break;
}
return false;
}
/***** Command: miscellaneous *****/
pascal OSErr DoMiscEvent ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
{
#ifdef DEBUG
Message("Apple event: Miscellaneous Event¥n");
#endif /* DEBUG */
//MyInspectDescList( theAppleEvent );
return noErr;
}
/***** Apple Event routines *****/
static OSErr GotRequiredParams ( AppleEvent *appleEvent )
{
DescType returnedType;
Size actualSize;
OSErr err;
err = AEGetAttributePtr( appleEvent, keyMissedKeywordAttr, typeWildCard,
&returnedType, nil, 0, &actualSize );
if ( err == errAEDescNotFound ) return noErr;
else if ( err == noErr ) return errAEEventNotHandled;
else return err;
}
static OSErr AEPutFieldArray ( AEDescList *resultList, ArrayHandle arrayH )
{
Handle theHndl;
long count, len, k;
long indexLast=0;
unsigned char *p, *q;
OSErr err = noErr;
count = ((Array *) *arrayH)->count;
if ( count <= 0 ) return err;
theHndl = ((Array *) *arrayH)->h;
HLock( theHndl );
p = (unsigned char *) *theHndl;
for ( k=0; k<count; k++ ) {
#ifdef TEST_QSORT
q = p + ((Array *) *arrayH)->pair[k].keyword;
len = ((Array *) *arrayH)->pair[k].keywordlen;
#else /* TEST_QSORT */
q = p + ((Array *) *arrayH)->pair[k].text;
len = ((Array *) *arrayH)->pair[k].textlen;
#endif /* TEST_QSORT */
#ifdef DEBUG
// Message("Apple event: DoResolveRecord AEPutPtr(%ld)¥n", (k+1));
#endif /* DEBUG */
err = AEPutPtr( resultList, indexLast, typeChar, q, len );
if ( err != noErr ) { ErrMsgAE( err, false ); break; }
}
HUnlock( theHndl );
return err;
}
static void ErrMsgAE ( long err, Boolean fatal )
{
#ifdef DEBUG
ErrorMessageAE ( err, fatal );
#endif /* DEBUG */
}
/***** Apple Event FileList *****/
static long gFSSpecListNum = 0;
static Handle gFSSpecList = nil;
long AECountFileList ( void )
{
return gFSSpecListNum;
}
void AEPutFile ( FSSpec *theFSSpec )
{
long index;
Size dataSize = sizeof( FSSpec );
Handle theHandle;
OSErr err;
theHandle = gFSSpecList;
if ( theHandle == nil ) {
theHandle = NewHandleClear( dataSize );
gFSSpecList = theHandle;
if ( theHandle == nil ) { /* error */
ErrorMessageMEM( memFullErr, true ); }
} else {
dataSize += GetHandleSize( theHandle );
SetHandleSize( theHandle, dataSize );
if ( (err=MemError()) != noErr ) { /* error */
ErrorMessageMEM( err, true ); }
}
index = gFSSpecListNum;
((FSSpec *) *theHandle)[index] = *theFSSpec;
gFSSpecListNum += 1;
}
Boolean AEGetFile ( FSSpec *theFSSpec, long index )
{
if ( index < 0 || gFSSpecListNum <= index ) return false;
*theFSSpec = ((FSSpec *) *gFSSpecList)[index];
return true;
}
void AEDisposFileList ( void )
{
if ( gFSSpecList != nil ) DisposHandle( gFSSpecList );
gFSSpecList = nil;
gFSSpecListNum = 0;
}
// end of program
#ifdef SAMPLE
void main( void )
{
GestaltCheck( gestaltSystemVersion );
// GestaltCheck( gestaltProcessorType ); // for version 1.1.1
InitToolbox();
SetupMenuBar();
SetupAppleEvent();
EventLoop();
ExitToShell();
}
void EventLoop( void )
{
Boolean gotEvent;
EventRecord event;
RgnHandle mouseRgn;
gDone = false;
mouseRgn = nil;
while ( gDone == false ) {
gotEvent = WaitNextEvent(everyEvent,&event,kSleep,mouseRgn);
if ( gotEvent ) DoEvent( &event );
}
}
void DoEvent( EventRecord *event )
{
char theChar;
Boolean toActive;
switch( event->what ) {
case kHighLevelEvent:
if ( event->message == kCoreEventClass )
switch ( *((long *) (&(event->where))) ) {
case kAEOpenApplication: gAEOpenAppl = true; break;
case kAEOpenDocuments: gAEOpenDocs = true; break;
case kAEPrintDocuments: gAEPrintDoc = true; break;
case kAEQuitApplication: gAEQuitAppl = true; break;
default: break; }
AEProcessAppleEvent( event );
break;
case mouseDown:
HandleMouseDown( event );
break;
case mouseUp:
case keyUp:
break;
case keyDown:
case autoKey:
case updateEvt:
DoUpdate( (WindowPtr) (event->message), event );
break;
case activateEvt:
toActive = ( (event->modifiers & activeFlag) == activeFlag );
DoActivate( (WindowPtr) (event->message), toActive );
break;
case diskEvt:
case networkEvt:
case driverEvt:
case app1Evt:
case app2Evt:
case app3Evt:
case osEvt:
DoSuspentResume( event );
break;
}
}
#endif /* SAMPLE */